<?php

namespace app\common\job;

use app\common\job\BaseJob;
use app\common\model\TaskAction;
use app\common\model\Tasks;
use think\Hook;
use think\Log;
use think\queue\Job;


/**
 * 任务自动操作
 */
class TaskAutoOper extends BaseJob
{

    /**
     * 任务自动到期
     */
    public function autoClose(Job $job, $data){
        try {
            $task = $data['task'];
            $action = $data['action'];
            // 重新查询任务
            $task = Tasks::get($task['id']);
            if (!$task){
                // 删除 job
                $job->delete();
                return true;
            }

            $task_ext = $task->ext_arr;

            //到期关闭分钟数
            $task_auto_close_minue = get_addon_config('dep')['task_auto_close_minue'] ? get_addon_config('dep')['task_auto_close_minue'] : 15;
            //允许的到期总次数
            $task_auto_close_num = get_addon_config('dep')['task_auto_close_num'] ? get_addon_config('dep')['task_auto_close_num'] : 1;

            //确认接单
            if ($action == 'operTake'){
                // 删除 job
                $job->delete();
                return true;
            }elseif ($action == 'operRefuse'){   //拒绝接单
                // 删除 job
                $job->delete();
                return true;

            }else{
                
                if ($task && $task['curr_flow'] == 'take' && $task->take_status == 0) {
                    \think\Db::transaction(function () use ($task,$task_ext,$task_auto_close_minue,$task_auto_close_num,$data) {
                        // 允许的到期次数小于等于1时，或者 到期次数 与 允许的到期次数一致
                        if ($task_auto_close_num <= 1 || (($task_ext['expired_num'] + 1) == $task_auto_close_num)){

                            //接单失败
                            $task->status = Tasks::STATUS_INVALID;   //任务状态:任务状态  -3=已拒绝接单-2=拒绝接单中,-1=接单失败,0=待接单,1=已接单,待取件，2=已取件,3=取件已送达,4=维修中,5=维修完成,还件中,6=任务已完成
                            $task->take_status = -1;
                            $task_ext['invalid_time'] = time();  // 取消时间
                            $task_ext['expired_num'] = $task_ext['expired_num'] + 1;  //任务刷新次数
                            $task->ext = json_encode($task_ext);
                            $task->save();

                            //添加任务动作
                            TaskAction::operAdd($task,null,'system','invalid',TaskAction::$memo_arr[0]);
                        }else{
                            //刷新一次任务

                            //任务重新开始倒计时
                            $task_ext['expired_time'] = time() + ($task_auto_close_minue * 60); //当前到期时间
                            $task_ext['expired_num'] = $task_ext['expired_num'] + 1;   //当前到期次数

                            //刷新任务倒计时
                            TaskAction::operAdd($task,null,'system','expired',TaskAction::$memo_arr[1]);

                            \think\Queue::later(($task_auto_close_minue * 60), '\app\common\job\TaskAutoOper@autoClose', ['task' => $task,'action'=>'auto'], 'lingtu');

                            // 更新订单扩展字段
                            $task->ext = json_encode($task_ext);
                            $task->save();

                            //重新发一次订阅推送
                            $params['task'] = $task;
                            $params['action'] = 'created';
                            Hook::listen('send_message',$params);
                        }
                    });
                }
                
            }
            // 删除 job
            $job->delete();
        } catch (\Exception $e) {
            // 队列执行失败
            \think\Log::write('queue-' . get_class() . '-autoClose' . '：执行失败，错误信息：' . $e->getMessage());
        }
    }

}